package rita.network;
/**
 * Javier Abell�n. 18 Mar 2006
 * 
 * Programa de ejemplo de como transmitir un fichero por un socket. Esta es el
 * main con el cliente, que piede un fichero, lo muestra en pantalla y lo
 * escribe cambiando el nombre.
 */

import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 * Pide un fichero al ServidorFichero, lo escribe en pantalla cuando lo recibe y
 * lo guarda en disco a�adiendo "_copia" al final del nombre del fichero.
 * 
 * @author Javier Abell�n
 */

public class ClienteFichero {

    /**
     * Main del Cliente
     * 
     * @param args
     *            de la l�nea de comandos. Se ignora.
     */
    public static void main(String[] args) {
        // Se crea el cliente y se le manda pedir el fichero.
        ClienteFichero cf = new ClienteFichero();
        cf.pide("/home/pvilaltella/workspace/RITA/robots/sample/batallaBin.bin", "localhost", 35557);
        cf.ejecutarComando();
    }

    public void ejecutarComando() {
        // TODO Auto-generated method stub
        /*
         * Process process = null; try { process =
         * Runtime.getRuntime().exec("lsb_release -a"); } catch (IOException e)
         * { // TODO Auto-generated catch block e.printStackTrace(); }
         * InputStream inputstream = process.getInputStream();
         * BufferedInputStream bufferedinputstream = new
         * BufferedInputStream(inputstream);
         */
        EjecutarComando ec = new EjecutarComando();
        System.out.print(new String("Ejecuta"));

    }

    /**
     * Establece comunicaci�n con el servidor en el puerto indicado. Pide el
     * fichero. Cuando llega, lo escribe en pantalla y en disco duro.
     * 
     * @param fichero
     *            path completo del fichero que se quiere
     * @param servidor
     *            host donde est� el servidor
     * @param puerto
     *            Puerto de conexi�n
     */
    public void pide(String fichero, String servidor, int puerto) {
        try {
            // Se abre el socket.
            Socket socket = new Socket(servidor, puerto);

            // Se env�a un mensaje de petici�n de fichero.
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            MensajeDameFichero mensaje = new MensajeDameFichero();
            mensaje.nombreFichero = fichero;
            oos.writeObject(mensaje);

            // Se abre un fichero para empezar a copiar lo que se reciba.
            // FileOutputStream fos = new FileOutputStream(mensaje.nombreFichero
            // + "_copia");
            FileOutputStream fos = new FileOutputStream("/tmp/" + "batallaBin.bin");

            // Se crea un ObjectInputStream del socket para leer los mensajes
            // que contienen el fichero.
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            MensajeTomaFichero mensajeRecibido;
            Object mensajeAux;
            do {
                // Se lee el mensaje en una variabla auxiliar
                mensajeAux = ois.readObject();

                // Si es del tipo esperado, se trata
                if (mensajeAux instanceof MensajeTomaFichero) {
                    mensajeRecibido = (MensajeTomaFichero) mensajeAux;
                    // Se escribe en pantalla y en el fichero
                    //System.out.print(new String(mensajeRecibido.contenidoFichero, 0, mensajeRecibido.bytesValidos));
                    fos.write(mensajeRecibido.contenidoFichero, 0, mensajeRecibido.bytesValidos);
                } else {
                    // Si no es del tipo esperado, se marca error y se termina
                    // el bucle
                    System.err.println("Mensaje no esperado " + mensajeAux.getClass().getName());
                    break;
                }
            } while (!mensajeRecibido.ultimoMensaje);

            // Se cierra socket y fichero
            fos.close();
            ois.close();
            socket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
